SSH Reversal Tunnel 反向隧道

使用ssh进行反向代理

我在实验室的内网里有一个工作站,安装的Linux系统,具体版本是Ubuntu 16.04。此外,我还有一个aliyun的ECS主机,这样我就有了一个公网IP。现在需要做的就是让我们的22端口能够绑定到aliyun主机的2221端口上。22端口是默认的ssh登陆端口。

1
ssh -v -N -R 2221:127.0.0.1:22 aliyun.ip

使用autossh进行反向代理

上网看了一下,似乎很多人都是使用autossh来进行反向代理,给出的理由是autossh会自动重连,但是我并没有尝试过。这里给出后台运行的命令

1
autossh -M 55551 -f -v -gNR *:2221:127.0.0.1:22 root@aliyun.ip > /home/yezhe/log/autossh.log 2>&1

自动启动

写/etc/init.d/脚本

在ubuntu系统中,可以在/etc/init.d下编写一个脚本来让指定的程序来自动运行。将下面的内容存储到/etc/init.d目录下,命名为autossh,然后再为其增加一执行权限sudo chmod +x autossh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh
### BEGIN INIT INFO
# Provides: autossh
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start or stop the autossh.
### END INIT INFO

case "$1" in
start)
start-stop-daemon --start --exec /home/yezhe/Workspace/autossh.sh
;;
stop)
start-stop-daemon --stop --name autossh
esac

写执行shell脚本

如果你仔细看这个代码,可以看到在后面有一个
/home/yezhe/Workspace/autossh.sh脚本,这个脚本里面实际包含了真正的autossh命令。下面贴出里面的内容

1
2
3
#!/bin/sh
autossh -M 55551 -f -v -gNR *:2221:127.0.0.1:22 root@hostip1 > /home/yezhe/log/autossh.log 2>&1
autossh -M 55552 -f -v -gNR *:2221:127.0.0.1:22 root@hostip2 > /home/yezhe/log/autossh.log 2>&1

将其中的root、hostip1和hostip2都可以改成具体的情况,我这里是配置了可以通过公钥登录hostip1和hostip2。按照/etc/init.d/autossh中写的,我把这个命令存成autossh.sh,放到了/home/yezhe/Workspace/下。

同样的还需要给这个sh脚本增加可执行权限

1
sudo chmod +x autossh.sh

配置自动登录

启动的时候机器执行上面的命令肯定使用root用户的,所以我就需要先切换到root用户来配置自动登录。

下面是一个比较奇怪的地方,以后有时间再去尝试一下。我一般是按照下面的步骤来配置root的自动登录的

1
2
3
4
su root
ssh-keygen
ssh-copy-id root@hostip1
ssh-copy-id root@hostip2

这种状况对于使用像

1
ssh root@hostip1

来登录是可以的,但是对于在非root用户的情况下使用

1
sudo ssh root@hostip1

来登录是不可行的。因此这里采用下面的配置方式,不需要切换到root

1
2
3
sudo ssh-keygen
sudo ssh-copy-id root@hotsip1
sudo ssh-copy-id root@hostip2

让/etc/init.d/autossh 开机启动

1
sudo update-rc.d autossh defaults 99

到此,可以使用sudo /etc/init.d/autossh start来启动命令,也可以使用sudo /etc/init.d/autossh stop来停止。

分享到